﻿using Newtonsoft.Json;  // 引入 JSON 序列化库
using System;  // 引入基础类库
using System.Collections.Generic;  // 引入集合类

namespace XchUserInfo.Model
{
    /// <summary>
    /// 通用分页列表类，用于封装分页查询结果，包括分页信息和数据列表。
    /// </summary>
    public class PagedList<T>
    {
        [JsonProperty("current_page")]  // JSON 序列化时使用的属性名
        public int CurrentPage { get; set; }  // 当前页

        [JsonProperty("page_size")]  // JSON 序列化时使用的属性名
        public int PageSize { get; set; }  // 每页条数

        [JsonProperty("total_item_count")]  // JSON 序列化时使用的属性名
        public int TotalItemCount { get; set; }  // 总记录数

        [JsonProperty("total_order_price_count")]  // JSON 序列化时使用的属性名
        public decimal TotalOrderPriceCount { get; set; }  // 总订单价格，适用于订单分页

        [JsonProperty("total_page_count")]  // JSON 序列化时使用的属性名
        public int TotalPageCount { get; set; }  // 总页数

        [JsonProperty("has_prev_page")]  // JSON 序列化时使用的属性名
        public bool HasPrevPage { get; set; }  // 是否有上一页

        [JsonProperty("has_next_page")]  // JSON 序列化时使用的属性名
        public bool HasNextPage { get; set; }  // 是否有下一页

        [JsonProperty("list")]  // JSON 序列化时使用的属性名
        public List<T> List { get; set; }  // 当前页的数据列表

        /// <summary>
        /// 构造函数，初始化分页数据。
        /// </summary>
        /// <param name="list">当前页的数据列表</param>
        /// <param name="pageIndex">当前页索引（从 0 开始）</param>
        /// <param name="pageSize">每页数据条数</param>
        /// <param name="totalCount">总记录数</param>
        /// <param name="prices">总订单价格（可选）</param>
        public PagedList(List<T> list, int pageIndex, int pageSize, int totalCount, decimal prices = 0)
        {
            CurrentPage = totalCount > 0 ? pageIndex + 1 : 0;  // 设置当前页，注意：分页从 1 开始
            PageSize = pageSize;  // 设置每页条数
            TotalItemCount = totalCount;  // 设置总记录数
            TotalOrderPriceCount = prices;  // 设置总订单价格
            TotalPageCount = (int)Math.Ceiling((double)totalCount / pageSize);  // 计算总页数
            HasPrevPage = CurrentPage > 1;  // 是否有上一页
            HasNextPage = CurrentPage < TotalPageCount;  // 是否有下一页
            List = list;  // 设置当前页的数据列表
        }
    }
}
